package handler

import (
	"fmt"
	"log/slog"
	"time"
	"trader/apps/common"
	"trader/apps/common/resp"
	"trader/models"

	"github.com/gin-gonic/gin"
	"xorm.io/xorm"
)

type UserHandler struct {
	Engine *xorm.Engine
}

func NewUserHandler(engine *xorm.Engine) *UserHandler {
	return &UserHandler{Engine: engine}
}

func (h *UserHandler) Debug(ctx *gin.Context) {
	slog.Debug("i am debug")
	slog.Info("i am info")
	userId, _ := ctx.Get("userId")
	username, _ := ctx.Get("username")
	slog.Info("user", "userId", userId, "username", username)
	resp.OKWithoutData(ctx, "success")
}

// Login 用户登录
func (h *UserHandler) Login(c *gin.Context) {
	var req LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		resp.Fail(c, fmt.Errorf("请求参数错误: %v", err))
		return
	}
	// 1. 查询用户
	user := &models.User{}
	has, err := h.Engine.Where("username = ?", req.Username).Get(user)
	if err != nil {
		slog.Error("login", "err", err)
		resp.Fail(c, fmt.Errorf("系统错误"))
		return
	}
	if !has {
		resp.Fail(c, fmt.Errorf("用户名或密码错误"))
		return
	}
	// 2. 验证密码(这里需要实现密码加盐验证逻辑)
	if !verifyPassword(req.Password, user.Password, user.Salt) {
		resp.Fail(c, fmt.Errorf("用户名或密码错误"))
		return
	}
	// 3. 检查用户状态
	if user.Status != 1 {
		resp.Fail(c, fmt.Errorf("用户已被禁用"))
		return
	}
	// 4. 生成JWT Token
	token, err := common.GenerateToken(user)
	if err != nil {
		slog.Error("generate token", "err", err)
		c.JSON(403, gin.H{"error": "生成Token失败"})
		return
	}
	// 5. 更新最后登录时间
	user.LastLoginAt = time.Now()
	_, _ = h.Engine.ID(user.Id).Cols("last_login_at").Update(user)

	// 6. 返回响应
	resp.OK(c, "登陆成功", LoginResponse{
		Token:    token,
		UserID:   user.Id,
		Username: user.Username,
	})
}

// Register 用户注册
func (h *UserHandler) Register(c *gin.Context) {
	var req RegisterRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		resp.Fail(c, fmt.Errorf("请求参数不合法: %v", err))
		return
	}
	// 1. 检查用户名是否已存在
	exists, err := h.Engine.Table("sys_user").Where("username = ?", req.Username).Exist()
	if err != nil {
		resp.Fail(c, fmt.Errorf("系统错误: %v", err))
		return
	}
	if exists {
		resp.Fail(c, fmt.Errorf("用户名已存在"))
		return
	}
	// 1.1 检查密码强度
	if !isStrongPassword(req.Password) {
		resp.Fail(c, fmt.Errorf("密码必须包含大小写字母和数字"))
		return
	}
	// 2. 生成密码盐和加密密码
	salt := generateSalt() // 生成随机盐值
	hashedPassword := hashPassword(req.Password, salt)
	// 3. 创建用户对象
	user := &models.User{
		Username: req.Username,
		Password: hashedPassword,
		Salt:     salt,
		Status:   1, // 默认启用状态
	}
	// 4. 保存用户到数据库
	affected, err := h.Engine.Insert(user)
	if err != nil || affected == 0 {
		resp.Fail(c, fmt.Errorf("注册失败，请稍后重试"))
		return
	}
	// 5. 返回成功响应
	resp.OK(c, "注册成功", gin.H{"userId": user.Id})

	go func() {
		defaultTradingAccount := new(models.TradingAccount)
		defaultTradingAccount.UserId = user.Id
		defaultTradingAccount.Name = "default"
		defaultTradingAccount.IsDefault = true
		defaultTradingAccount.Remark = "系统默认"
		_, _ = h.Engine.Insert(defaultTradingAccount)
	}()
}
